Effective Java [아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있음, 그런데 마침 호출되는 메서드가 재정의 기능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야함 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야함 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별... Effective JavaEffective Java [아이템 20] 추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스임, 이렇게 두 메커니즘은 모두 인스턴스 메서드를 구현 형태로 제공할 수 있음 인터페이스의 메서드 중 구현 방법이 명백한 것이 있다면, 그 구현을 디폴트 메서드로 제공해 프로그래머들의 일감을 덜어줄 수 있음 인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 있음 추상 골... Effective JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item15 - 클래스와 멤버의 접근 권한을 최소화하라 클래스와 멤버의 접근 권한을 최소화하라. 그 중 하나가 접근 제어 메커니즘이다. 이는 클래스, 인터페이스, 멤버의 접근 허용 범위(접근성)를 제어하는 것이다. 이때 접근성은 접근 제한자로 명시될 수 있다. 클래스나 인터페이스, 멤버등의 접근 권한을 명시한다. private - 멤버를 선언한 톱레벨 클래스에서만 접근 가능. package-private - 해당 패키지 안의 모든 클래스에서 접근... 공부Effective Java스터디이펙티브 자바JavaEffective Java [ ITEM 22 ] 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 클래스가 어떤 인터페이스를 구현 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것 인터페이스는 이 용도로만 사용해야 한다! 상수 인터페이스 상수 인터페이스 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스 정규화된 이름을 쓰는 걸 피하고자 인터페이스를 구현하곤 한다. 상수 ... Effective Java이펙티브 자바Effective Java [이펙티브 자바] 클래스와 인터페이스 Item16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 자바에서는 추상화의 기본 단위로 클래스(Class)와 인터페이스(Interface) 를 정의하고 있고, 이는 곧 자바의 심장과도 같다. 다른 컴포넌트에서 해당 클래스 데이터 필드에 직접 접근이 가능하다. 그 말은, 캡슐화(Encapsulation)가 전혀 안되기 때문에 그에 따른 장점도 얻을 수 없다는 말이다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. ... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item17 - 변경 가능성을 최소화하라 일반적으로 불변 클래스는 가변 클래스에 비해 설계하고 구현하고 사용하기가 쉽고, 그 외에, 인스턴스의 값을 변경할 수 있는 로직이 들어가는 메서드는 안된다. 클래스를 확장할 수 없도록 한다. 기술적으로 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변은 된다. 코드에서 사칙연산 부분을 보면, 인스턴스 본인의 필드 값을 바꾸지 않고 결과만 리턴하는 것을 볼... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java 이펙티브 자바 아이템6 정리 String 인스턴스 아래 코드는 실행 될 때 마다 String 인스턴스를 새로 만든다. 아래 코드는 새로운 인스턴스를 만들지만 하나의 String 인스턴스를 사용한다. 이 방법은 문자열 리터럴 생성 방식으로 String Contstant Pool이란 영역에 저장된다. String.maches()의 성능 이슈 아래 코드는 String.marches의 내부 코드다. 코드를 보면 matches를... Effective Java이펙티브 자바Effective Java Item 2 : 매개변수가 많다면 빌더 패턴을 고려하라! 그리고 겉으로만 보기에는 그리 나빠보이지 않을 수 있지만, 매개변수의 개수가 더 늘어나게 된다면 생성자 코드가 걷잡을 수 없게 될 것이다. 또한 매개변수의 입력을 받을 때 매개변수가 몇 개인지 주의해서 세어보아야 하고, 같은 데이터 타입의 매개변수를 실수로 바꿔서 입력하여도 컴파일러는 알아채지 못하고, 엉뚱한 동작을 하게 된다. 이러한 문제 때문에 자바빈즈 패턴에서는 클래스를 불변으로 만들 ... Effective JavaJavaEffective Java 객체 생성과 파괴(1) 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공 할 수 있다. 클래스는 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다. 1. 이름을 가질 수 있다. 반면 정적 팩터리는 객체의 특성을 쉽게 묘사 할 수 있다. 반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩터리 방식의 클래스는 언제 어느 인스턴스를 살아 있게 할지를 철저히 통제 할 수 있다. 또한 불변 값 클래스에서 동... Effective JavaEffective Java [아이템 1] 생성자 대신 정적 팩터리 메서드를 고려하라 여기서 생성자와 별도로 정적 팩터리 메소드를 통해서 인스턴스를 얻을 수 있음 이름을 가질 수 있는 정적 팩터리 메서드에는 이런 제약이 없음, 앞서 설명한대로 생성자가 여러 개 필요할 것 같으면 이 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주면 해결이 됨 이 덕분에 불변 클래스(아이템 17)는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활... Effective JavaEffective Java [아이템 2] 생성자에 매개변수가 많다면 빌더를 고려하라 빌더의 setter 메서드들은 빌더 자신을 반환하기 때문에 연쇄적으로 호출 할 수 있음, 이런 방식을 메서드 호출이 흐르듯 연결된다는 뜻으로 플루언트 API 혹은 메서드 연쇄라고 함 위와 같이 빌더 패턴 사용시 유효성 검사를 추가적으로 진행해 줄 수 있음 여기서 잘못된 매개변수를 최대한 일찍 발견하려면 위와 같이 빌더의 생성자와 메서드에서 입력 매개변수를 검사하고 이런식으로 불변식 검사를 할... Effective JavaEffective Java [아이템 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴의 전형적인 예는 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있음 예를 들면 아래와 같이 보일 수 있음, 그래서 함수와 같은 무상태 객체라고 한 것 책 예시에서 private 생성자로 public static final 필드인 Elvis.INSTANCE를 초기화 할 때 딱 한 번 호출하는데 이 의미 자체가 인스턴스가 전체 시스템에서 하나... Effective JavaEffective Java [아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이 존재함, 이는 의존 객체 주입의 한 형태로, 맞춤법 검사기 생성시 의존 객체인 사전을 주입해줌 위와 같은 방식이 의존 객체 주입 패턴의 방식 중 하나이고 여기서는 dictionary라는 딱 하나의 자원만 사용하지만, 자원이 몇 개든 의존 관계가 어떻든 상관없이 잘 작동함 의존 객체 주입은 생성자, 정적 팩터리, 빌더 모두에 똑같이 ... Effective JavaEffective Java [아이템 7] 다 쓴 객체 참조를 해제하라 C, C++처럼 메모리를 직접 관리해야 하는 언어와 달리 자바의 경우 가비지 컬렉터가 다 쓴 객체를 알아서 회수를 함 이게 왜 심각한 경우가 되냐면 단순히 메모리를 사용했을 때와 비교해서 사용량과 가비지 컬렉션 활동이 늘어나 속도가 안 그래도 느린데 메모리 영역이 하드 디스크에 일시적으로 저장되어 버리는 것임, 이는 메모리보다 하드 디스크에서의 속도가 월등하게 느리기 때문에 정말 이 영역까지... Effective JavaEffective Java [아이템 8] finalizer와 cleaner 사용을 피하라 finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수 있음, 생성자나 직렬화 과정에서 예외가 발생하며나, 이 생성되다 만 객체에서 악의적인 하위 클래스의 finalizer가 수행될 수 있게 됨, 그리고 정적 필드에 자신의 참조를 할당해 가비지 컬렉터가 수집하지 못하게 막을 수 있음 이렇게 일그러진 객체가 만들어지면 이 객체의 메서드를 호출해 애초... Effective JavaEffective Java [아이템 9] try-finally 보다는 try-with-resources를 사용하라 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많음(InputStream, OutputStream, java.sql.Collection 등) 전통적으로는 try-finally를 사용함 여기서 위의 try-finally에서 자우너을 하나 더 사용하면 아래와 같이 됨(하나 쓴 걸로 지저분해짐) 만약 물리적인 문제가 생겨서 firstLineOfFile 메서드 안의 rea... Effective JavaEffective Java [아이템 10] equals는 일반 규약을 지켜 재정의하라 equals의 경우 재정의가 쉬워보이지만 고려할 부분이 꽤 있음, 이 문제를 회피하는 것은 재정의를 하지 않는 것이긴 함, 그렇게 두면 그 클래스의 인스턴스는 오직 자기 자신과만 같아짐 equals 사용은 객체 식별성(두 객체가 물리적으로 같은가)이 아니라 논리적 동치성을 확인해야하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때가 주로 있음(값 클래스(In... Effective JavaEffective Java [아이템 11] equals를 재정의하려거든 hashCode도 재정의하라 그렇지 않으면 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킴 hashCode 재정의를 잘못했을 때 크게 문제되는 사항은 논리적으로 같은 객체는 같은 해시코드를 반환해야 하는 부분임 equals에서는 물리적으로 다른 두 객체를 논리적으로 같다고 했지만 hashCode에서는 이 둘을 전혀 다르다고 판단하여 서로 다른 값을 반환함 hashC... Effective JavaEffective Java 67. 최적화는 신중히 하라 좋은 프로그램이지만 원하는 성능이 나오지 않은다면 그 아키텍처 자체가 최적화할 수 있는 길을 안내해줄 것이다. 좋은 프로그램은 정보 은닉 원칙을 따르기에 개별 구성요소의 내부를 독립적으로 설계할 수 있다. 따라서 시스템의 나머지에 영향을 주지 않고도 각 요소를 다시 설계할 수 있다. 이런 설계 요소들은 완성 후에는 변경하기 어렵거나 불가능할 수 있으며 동시에 시스템 성능을 심각하게 제한할 수... Effective JavaEffective Java 58. 전통적인 for 문보다는 for-each 문을 사용하라 전통적인 for문보다 for-each문이 간결할 때가 많다. for-each문은 Iterable 인터페이스를 구현한 객체라면 무엇이든 순회할 수 있다. 다음 코드를 보자. i.next()를 계속 호출하기 때문에 결과값은 "ONE ONE"부터 "SIX SIX"가 출력된다. 이는 의도한 바가 아니다. 위 코드를 해결하기 위해서는 바깥 반복문에 바깥 원소를 저장하는 변수를 하나 추개햐아 한다. f... Effective JavaEffective Java [이펙티브 자바] 객체의 생성과 파괴 Item7 - 다 쓴 객체 참조를 해제하라 "2장 - 객체의 생성과 파괴" 는 다음과 같은 기준으로 맥락을 잡고 있다. 객체를 만들어야 할 때는 언제인가 객체를 만들지 말아야 할 때는 언제인가 객체를 제 때에 파괴시키는 방법은 무엇인가 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 다 쓴 객체 참조를 해체하라. 내가 배웠던 자바의 가장 큰 특징 중 하나는 바로 가비지 컬렉터가 있다는 것이다. 동적 메모리를 사용하기 때문에 사... Effective JavaJava이펙티브 자바스터디공부Effective Java 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 다음은 흔히 볼 수 있는 메서드다. 사실, 재고가 없다고 해서 특별하게 취급할 필요는 없다. null 을 반환하기 위해서는 반환하는 쪽에서도 null 을 반환하는 상황을 특별하게 관리해줘야 하기 때문에 코드가 더 복잡해진다. 빈 컨테이너를 할당하는데 비용이 들기 때문에 null 이 낫다는 주장이 있지만 다음 두 가지 측면에서 틀린 주장이다. 성능 분석 결과 빈 컨테이너 할당이 성능 저하의 주... Effective JavaEffective Java
[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있음, 그런데 마침 호출되는 메서드가 재정의 기능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야함 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야함 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별... Effective JavaEffective Java [아이템 20] 추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스임, 이렇게 두 메커니즘은 모두 인스턴스 메서드를 구현 형태로 제공할 수 있음 인터페이스의 메서드 중 구현 방법이 명백한 것이 있다면, 그 구현을 디폴트 메서드로 제공해 프로그래머들의 일감을 덜어줄 수 있음 인터페이스와 추상 골격 구현 클래스를 함께 제공하는 식으로 인터페이스와 추상 클래스의 장점을 모두 취하는 방법도 있음 추상 골... Effective JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item15 - 클래스와 멤버의 접근 권한을 최소화하라 클래스와 멤버의 접근 권한을 최소화하라. 그 중 하나가 접근 제어 메커니즘이다. 이는 클래스, 인터페이스, 멤버의 접근 허용 범위(접근성)를 제어하는 것이다. 이때 접근성은 접근 제한자로 명시될 수 있다. 클래스나 인터페이스, 멤버등의 접근 권한을 명시한다. private - 멤버를 선언한 톱레벨 클래스에서만 접근 가능. package-private - 해당 패키지 안의 모든 클래스에서 접근... 공부Effective Java스터디이펙티브 자바JavaEffective Java [ ITEM 22 ] 인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 클래스가 어떤 인터페이스를 구현 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것 인터페이스는 이 용도로만 사용해야 한다! 상수 인터페이스 상수 인터페이스 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스 정규화된 이름을 쓰는 걸 피하고자 인터페이스를 구현하곤 한다. 상수 ... Effective Java이펙티브 자바Effective Java [이펙티브 자바] 클래스와 인터페이스 Item16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 자바에서는 추상화의 기본 단위로 클래스(Class)와 인터페이스(Interface) 를 정의하고 있고, 이는 곧 자바의 심장과도 같다. 다른 컴포넌트에서 해당 클래스 데이터 필드에 직접 접근이 가능하다. 그 말은, 캡슐화(Encapsulation)가 전혀 안되기 때문에 그에 따른 장점도 얻을 수 없다는 말이다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. ... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java [이펙티브 자바] 클래스와 인터페이스 Item17 - 변경 가능성을 최소화하라 일반적으로 불변 클래스는 가변 클래스에 비해 설계하고 구현하고 사용하기가 쉽고, 그 외에, 인스턴스의 값을 변경할 수 있는 로직이 들어가는 메서드는 안된다. 클래스를 확장할 수 없도록 한다. 기술적으로 기본 타입 필드나 불변 객체를 참조하는 필드를 public final로만 선언해도 불변은 된다. 코드에서 사칙연산 부분을 보면, 인스턴스 본인의 필드 값을 바꾸지 않고 결과만 리턴하는 것을 볼... 자바공부Effective Java스터디이펙티브 자바JavaEffective Java 이펙티브 자바 아이템6 정리 String 인스턴스 아래 코드는 실행 될 때 마다 String 인스턴스를 새로 만든다. 아래 코드는 새로운 인스턴스를 만들지만 하나의 String 인스턴스를 사용한다. 이 방법은 문자열 리터럴 생성 방식으로 String Contstant Pool이란 영역에 저장된다. String.maches()의 성능 이슈 아래 코드는 String.marches의 내부 코드다. 코드를 보면 matches를... Effective Java이펙티브 자바Effective Java Item 2 : 매개변수가 많다면 빌더 패턴을 고려하라! 그리고 겉으로만 보기에는 그리 나빠보이지 않을 수 있지만, 매개변수의 개수가 더 늘어나게 된다면 생성자 코드가 걷잡을 수 없게 될 것이다. 또한 매개변수의 입력을 받을 때 매개변수가 몇 개인지 주의해서 세어보아야 하고, 같은 데이터 타입의 매개변수를 실수로 바꿔서 입력하여도 컴파일러는 알아채지 못하고, 엉뚱한 동작을 하게 된다. 이러한 문제 때문에 자바빈즈 패턴에서는 클래스를 불변으로 만들 ... Effective JavaJavaEffective Java 객체 생성과 파괴(1) 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공 할 수 있다. 클래스는 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다. 1. 이름을 가질 수 있다. 반면 정적 팩터리는 객체의 특성을 쉽게 묘사 할 수 있다. 반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩터리 방식의 클래스는 언제 어느 인스턴스를 살아 있게 할지를 철저히 통제 할 수 있다. 또한 불변 값 클래스에서 동... Effective JavaEffective Java [아이템 1] 생성자 대신 정적 팩터리 메서드를 고려하라 여기서 생성자와 별도로 정적 팩터리 메소드를 통해서 인스턴스를 얻을 수 있음 이름을 가질 수 있는 정적 팩터리 메서드에는 이런 제약이 없음, 앞서 설명한대로 생성자가 여러 개 필요할 것 같으면 이 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주면 해결이 됨 이 덕분에 불변 클래스(아이템 17)는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활... Effective JavaEffective Java [아이템 2] 생성자에 매개변수가 많다면 빌더를 고려하라 빌더의 setter 메서드들은 빌더 자신을 반환하기 때문에 연쇄적으로 호출 할 수 있음, 이런 방식을 메서드 호출이 흐르듯 연결된다는 뜻으로 플루언트 API 혹은 메서드 연쇄라고 함 위와 같이 빌더 패턴 사용시 유효성 검사를 추가적으로 진행해 줄 수 있음 여기서 잘못된 매개변수를 최대한 일찍 발견하려면 위와 같이 빌더의 생성자와 메서드에서 입력 매개변수를 검사하고 이런식으로 불변식 검사를 할... Effective JavaEffective Java [아이템 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴의 전형적인 예는 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있음 예를 들면 아래와 같이 보일 수 있음, 그래서 함수와 같은 무상태 객체라고 한 것 책 예시에서 private 생성자로 public static final 필드인 Elvis.INSTANCE를 초기화 할 때 딱 한 번 호출하는데 이 의미 자체가 인스턴스가 전체 시스템에서 하나... Effective JavaEffective Java [아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이 존재함, 이는 의존 객체 주입의 한 형태로, 맞춤법 검사기 생성시 의존 객체인 사전을 주입해줌 위와 같은 방식이 의존 객체 주입 패턴의 방식 중 하나이고 여기서는 dictionary라는 딱 하나의 자원만 사용하지만, 자원이 몇 개든 의존 관계가 어떻든 상관없이 잘 작동함 의존 객체 주입은 생성자, 정적 팩터리, 빌더 모두에 똑같이 ... Effective JavaEffective Java [아이템 7] 다 쓴 객체 참조를 해제하라 C, C++처럼 메모리를 직접 관리해야 하는 언어와 달리 자바의 경우 가비지 컬렉터가 다 쓴 객체를 알아서 회수를 함 이게 왜 심각한 경우가 되냐면 단순히 메모리를 사용했을 때와 비교해서 사용량과 가비지 컬렉션 활동이 늘어나 속도가 안 그래도 느린데 메모리 영역이 하드 디스크에 일시적으로 저장되어 버리는 것임, 이는 메모리보다 하드 디스크에서의 속도가 월등하게 느리기 때문에 정말 이 영역까지... Effective JavaEffective Java [아이템 8] finalizer와 cleaner 사용을 피하라 finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수 있음, 생성자나 직렬화 과정에서 예외가 발생하며나, 이 생성되다 만 객체에서 악의적인 하위 클래스의 finalizer가 수행될 수 있게 됨, 그리고 정적 필드에 자신의 참조를 할당해 가비지 컬렉터가 수집하지 못하게 막을 수 있음 이렇게 일그러진 객체가 만들어지면 이 객체의 메서드를 호출해 애초... Effective JavaEffective Java [아이템 9] try-finally 보다는 try-with-resources를 사용하라 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많음(InputStream, OutputStream, java.sql.Collection 등) 전통적으로는 try-finally를 사용함 여기서 위의 try-finally에서 자우너을 하나 더 사용하면 아래와 같이 됨(하나 쓴 걸로 지저분해짐) 만약 물리적인 문제가 생겨서 firstLineOfFile 메서드 안의 rea... Effective JavaEffective Java [아이템 10] equals는 일반 규약을 지켜 재정의하라 equals의 경우 재정의가 쉬워보이지만 고려할 부분이 꽤 있음, 이 문제를 회피하는 것은 재정의를 하지 않는 것이긴 함, 그렇게 두면 그 클래스의 인스턴스는 오직 자기 자신과만 같아짐 equals 사용은 객체 식별성(두 객체가 물리적으로 같은가)이 아니라 논리적 동치성을 확인해야하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의되지 않았을 때가 주로 있음(값 클래스(In... Effective JavaEffective Java [아이템 11] equals를 재정의하려거든 hashCode도 재정의하라 그렇지 않으면 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킴 hashCode 재정의를 잘못했을 때 크게 문제되는 사항은 논리적으로 같은 객체는 같은 해시코드를 반환해야 하는 부분임 equals에서는 물리적으로 다른 두 객체를 논리적으로 같다고 했지만 hashCode에서는 이 둘을 전혀 다르다고 판단하여 서로 다른 값을 반환함 hashC... Effective JavaEffective Java 67. 최적화는 신중히 하라 좋은 프로그램이지만 원하는 성능이 나오지 않은다면 그 아키텍처 자체가 최적화할 수 있는 길을 안내해줄 것이다. 좋은 프로그램은 정보 은닉 원칙을 따르기에 개별 구성요소의 내부를 독립적으로 설계할 수 있다. 따라서 시스템의 나머지에 영향을 주지 않고도 각 요소를 다시 설계할 수 있다. 이런 설계 요소들은 완성 후에는 변경하기 어렵거나 불가능할 수 있으며 동시에 시스템 성능을 심각하게 제한할 수... Effective JavaEffective Java 58. 전통적인 for 문보다는 for-each 문을 사용하라 전통적인 for문보다 for-each문이 간결할 때가 많다. for-each문은 Iterable 인터페이스를 구현한 객체라면 무엇이든 순회할 수 있다. 다음 코드를 보자. i.next()를 계속 호출하기 때문에 결과값은 "ONE ONE"부터 "SIX SIX"가 출력된다. 이는 의도한 바가 아니다. 위 코드를 해결하기 위해서는 바깥 반복문에 바깥 원소를 저장하는 변수를 하나 추개햐아 한다. f... Effective JavaEffective Java [이펙티브 자바] 객체의 생성과 파괴 Item7 - 다 쓴 객체 참조를 해제하라 "2장 - 객체의 생성과 파괴" 는 다음과 같은 기준으로 맥락을 잡고 있다. 객체를 만들어야 할 때는 언제인가 객체를 만들지 말아야 할 때는 언제인가 객체를 제 때에 파괴시키는 방법은 무엇인가 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 다 쓴 객체 참조를 해체하라. 내가 배웠던 자바의 가장 큰 특징 중 하나는 바로 가비지 컬렉터가 있다는 것이다. 동적 메모리를 사용하기 때문에 사... Effective JavaJava이펙티브 자바스터디공부Effective Java 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 다음은 흔히 볼 수 있는 메서드다. 사실, 재고가 없다고 해서 특별하게 취급할 필요는 없다. null 을 반환하기 위해서는 반환하는 쪽에서도 null 을 반환하는 상황을 특별하게 관리해줘야 하기 때문에 코드가 더 복잡해진다. 빈 컨테이너를 할당하는데 비용이 들기 때문에 null 이 낫다는 주장이 있지만 다음 두 가지 측면에서 틀린 주장이다. 성능 분석 결과 빈 컨테이너 할당이 성능 저하의 주... Effective JavaEffective Java